/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Mail;

import java.io.Serializable;

/**
 *
 * @author yonmigongora@gmail.com
 */
public class MailServer implements Serializable {

    private String nombre;
    private ListaMensajes listMessage;
    private ListaUsuarios listUsuarios;

    /**
     * prepara al MailServer para poder funcionar.
     *
     * @param nombreServidor
     */
    public MailServer(String nombreServidor) {
        listMessage = new ListaMensajes();
        listUsuarios = new ListaUsuarios();
        nombre = nombreServidor;
    }

    /**
     * consulta el numero de mensajes esperando por leer
     *
     * @param name el nombre del usuario que los solicita
     * @return la cantidad de mensajes esperando leer.
     */
    public int getMessagesWaiting(String name) {
        int contadorMensajes = 0;
        for (int i = 0; i < listMessage.longitud(); i++) {
            Message mensaje = listMessage.obtenerMensaje(i);
            String destinatario = mensaje.obtenerDestinatario();
            contadorMensajes = contadorMensajes + comparar(name, destinatario);
        }
        return contadorMensajes;
    }

    /**
     * Compara si el usuario que envia es el mismo que es que recibe
     * @param user nombre de usuario que envia
     * @param destinatario nombre de usuario que recibe
     * @return cantidad de mensajes incrementado
     */
    private int comparar(String user, String destinatario) {
        int contadorMensajes = 0;
        if (user.equals(destinatario)) {
            contadorMensajes++;
        }
        return contadorMensajes;
    }

    /**
     * obtiene el siguiente mensaje del usuario
     *
     * @param name el nombre del usuario que los solicita
     * @return el siguiente mensaje del usuario.
     */
    public Message getNextMessage(String name) {
        int contador = 0;
        boolean existe = false;
        Message msj = null;
        while (contador < listMessage.longitud() && existe == false) {
            msj = listMessage.obtenerMensaje(contador);
            String destinatario = msj.obtenerDestinatario();
            existe = destinatario.equals(name);
            contador++;
            listMessage.remove(msj);

        }
        return msj;
    }

    /**
     * Recupera los mensajes del usuario
     * @param user nombre del usuario
     * @return lista de mensajes
     */
    public ListaMensajes getMessages(String user) {
        ListaMensajes mensajesDelUsuario = new ListaMensajes();
        for (int i = 0; i < listMessage.longitud(); i++) {
            Message msj = listMessage.obtenerMensaje(i);
            compararYagregar(mensajesDelUsuario, msj, user);
        }
        return mensajesDelUsuario;
    }

    /**
     * Recupera los mensajes leidos del usuario
     * @param user nombre del usuario que esta logeado
     * @return Lista de mensajes
     */
    public ListaMensajes getMessagesLeidos(String user) {
        ListaMensajes mensajesDelUsuario = new ListaMensajes();
        for (int i = 0; i < listMessage.longitudLeido(); i++) {
            Message msj = listMessage.obtenerMensajeLeido(i);
            compararYagregar(mensajesDelUsuario, msj, user);
        }
        return mensajesDelUsuario;
    }

    /**
     * Verifica si el mensaje es para el mismo usuario
     * @param lista lista de mensajes del usuario
     * @param mensaje mensaje a ser enviado
     * @param user nombre del usuario que envia
     */
    private void compararYagregar(ListaMensajes lista, Message mensaje, String user) {
        String dest =mensaje.obtenerDestinatario();
        if (dest.equals(user)) {
            lista.add(mensaje);
        }
    }

    /**
     * Toma el mensaje del usuario y envia al destinatario
     *
     * @param message el contenido del mensaje del usuario
     */
    public void post(Message message) {
        listMessage.add(message);
    }

    /**
     * Recupera toda la lista de mensajes
     * @return array de mensajes
     */
    public Message[] obtenerListaMensajes() {
        return listMessage.obtenerMensajes();
    }

    /**
     * Recupra la lista de los usuarios que estan registrados en el servidor
     * @return array con los nombres de los clientes
     */
    public String[] obtenerListaUsuarios() {
        return listUsuarios.obtenerUsuarios();
    }

    /**
     * Registra un usuario al servidor
     * @param usuario nombre de usuario
     */
    public void añadirUsuario(String usuario) {
        listUsuarios.agregarUsuario(usuario);
    }

    /**
     * Recupera el nombre del servidor
     * @return nombre del servidor
     */
    public String obtenerNombre() {
        return nombre;
    }

    /**
     * Recupera la lista de usuarios del servidor
     * @return Lista de usuarios
     */
    public ListaUsuarios obtenerListaUsers() {
        return listUsuarios;
    }

    /**
     * Recupera la lista de mensajes que se encuentran en el servidor
     * @return Lista de mensajes
     */
    public ListaMensajes obtenerListaMsj() {
        return listMessage;
    }
}
